#============================================
# #知识点
# Mixins机制
# ​ 一个子类可以同时继承多个父类，这样的设计常被人诟病，
# 一来它有可能导致可恶的菱形问题，二来在人的世界观里继承应该是个”is-a”关系。 
# 比如轿车类之所以可以继承交通工具类，是因为基于人的世界观，我们可以说：轿车是一个(“is-a”)交通工具，
# 而在人的世界观里，一个物品不可能是多种不同的东西，因此多重继承在人的世界观里是说不通的，
# 它仅仅只是代码层面的逻辑。不过有没有这种情况，一个类的确是需要继承多个类呢？
# ​ 答案是有，我们还是拿交通工具来举例子:
# ​ 民航飞机、直升飞机、轿车都是一个（is-a）交通工具，前两者都有一个功能是飞行fly，但是轿车没有，
# 所以如下所示我们把飞行功能放到交通工具这个父类中是不合理的
#============================================
# 现在我们的飞机同时具有了交通工具及飞行器两种属性，而且我们不需要重写飞行器中的飞行方法，
# 同时我们没有破坏单一继承的原则。飞机就是一种交通工具，可飞行的能力是飞机的属性，通过继承接口来获取。
# 回到主题，Python语言可没有接口功能，但Python提供了Mixins机制，
# 简单来说Mixins机制指的是子类混合(mixin)不同类的功能，而这些类采用统一的命名规范（例如Mixin后缀），
# 以此标识这些类只是用来混合功能的，并不是用来标识子类的从属"is-a"关系的，所以Mixins机制本质仍是多继承，

# 可以看到，上面的CivilAircraft、Helicopter类实现了多继承，不过它继承的第一个类我们起名为FlyableMixin，
# 而不是Flyable，这个并不影响功能，但是会告诉后来读代码的人，这个类是一个Mixin类，表示混入(mix-in)，
# 这种命名方式就是用来明确地告诉别人（python语言惯用的手法），这个类是作为功能添加到子类中，而不是作为父类，
# 它的作用同Java中的接口。
# 所以从含义上理解，CivilAircraft、Helicopter类都只是一个Vehicle，而不是一个飞行器。
# 使用Mixin类实现多重继承要非常小心
# 首先它必须表示某一种功能，而不是某个物品，python 对于mixin类的命名方式一般以 Mixin, able, ible 为后缀
# 其次它必须责任单一，如果有多个功能，那就写多个Mixin类，一个类可以继承多个Mixin，为了保证遵循继承的“is-a”原则，
# 只能继承一个标识其归属含义的父类然后，它不依赖于子类的实现最后，子类即便没有继承这个Mixin类，主要的父类只可以有一个
# 也照样可以工作，就是缺少了某个功能。（比如飞机照样可以载客，就是不能飞了）
#============================================